/**
 * @description: nio 笔记
 * @author: eii
 * @time: 2020/7/13 12:06 上午
 */
package eiisan.nio;

/*

笔记摘抄自 https://www.cnblogs.com/dolphin0520/p/3919162.html
java. io
java nio
java.io 中最为核心的一个概念是流(Stream) ，面向流的编程。Java中Stream是单向，一个流要么是输入流，要么是输出流，不可能同时既是输入流又是输出流。
public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");
        InputStream inputStream = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        inputStream.read(bytes);
        inputStream.close();
    }
}
java.nio 在NIO中有几个比较关键的概念：Channel（通道），Buffer（缓冲区），Selector（选择器）。
在java.nio中
我们是面向块（block）或是 缓冲区（buffer）编程的，Buffer本身就是一块内存， 底层实现上，它实际上是个数组。数据的读、写都是通过Buffef来实现的。
除了数组之外，Buffer还提供 了对于数据的结构化访问方式，并且可以追踪到系统的读写过程。
Java中的原生数据类型 基本都有各自对应的Buffer类型，如
ByteBuffer
IntBuffer
CharBuffer
LongBuffer
DoubleBuffer
FloatBuffer
ShortBuffer

Selector。可以说它是NIO中最关键的一个部分，Selector的作用就是用来轮询每个注册的Channel，一旦发现Channel有注册的事件发生，便获取事件然后进行处理
用单线程处理一个Selector，然后通过Selector.select()方法来获取到达事件，在获取了到达事件之后，就可以逐个地对这些事件进行响应处理。

Channel和传统IO中的Stream很相似，虽然很相似，但是有很大的区别，主要区别为：通道是双向的，通过一个Channel既可以进行读，也可以进行写；而Stream只能进行单向操作，通过一个Stream只能进行读或者写；
　　以下是常用的几种通道：
FileChannel
SocketChanel
ServerSocketChannel
DatagramChannel
通过使用FileChannel可以从文件读或者向文件写入数据；
通过SocketChannel，以TCP来向网络连接的两端读写数据；
通过ServerSocketChanel能够监听客户端发起的TCP连接，并为每个TCP连接创建一个新的SocketChannel来进行数据读写；
通过DatagramChannel，以UDP协议来向网络连接的两端读写数据。
　　
下面给出通过FileChannel来向文件中写入数据的一个例子：

public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");
        FileOutputStream outputStream = new FileOutputStream(file);
        FileChannel channel = outputStream.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        String string = "java nio";
        buffer.put(string.getBytes());
        buffer.flip();     //此处必须要调用buffer的flip方法
        channel.write(buffer);
        channel.close();
        outputStream.close();
    }
}

通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio"，注意在调用channel的write方法之前必须调用buffer的flip方法，否则无法正确写入内容，至于具体原因，自行学习

 */
